// utils/request.js
// 1. 引入 uni-ajax 模块=>用法和 axios 类似
import ajax from '@/uni_modules/u-ajax'
import { useUserStore } from '@/stores/user.js'
// 定义 tabBar 的路径
const tabBarPagePaths = [
	'pages/task/index',
	'pages/message/index',
	'pages/my/index'
]
//  2. 创建请求实例
const instance = ajax.create({
	// 初始配置=》配置后台请求基础地址
	baseURL: 'https://slwl-api.itheima.net'
})

// 添加请求拦截器=》请求前
instance.interceptors.request.use(
	config => {
		// 场景1: 请求前显示 loading 加载效果
		uni.showLoading({
			title: '正在加载...',
			mask: false // 避免没有数据时候，用户点击页面中元素
		})
		// 场景2：将来登录实现后统一添加 token 到 header
		const store = useUserStore()
		if (store.token) {
			config.header.Authorization = store.token
		}
		// 在发送请求前做些什么
		return config
	},
	error => {
		// 对请求错误做些什么
		return Promise.reject(error)
	}
)

// 添加响应拦截器=》请求后
instance.interceptors.response.use(
	response => {
		//  1. 请求成功走这里
		// 对响应数据做些什么
		// 错误统一处理
		// console.log('请求出错：', response.data)
		if (response.data.code !== 200) {
			// 执行消息提示会关闭loading
			// 	uni.showToast消息提示会关闭之前的 loading 提示
			uni.showToast({
				title: response.data.msg
			})
			// uni.hideLoading()
			// 阻断 await 之后代码执行
			return Promise.reject(response.data)
		}
		// 请求成功或失败都关闭loading
		uni.hideLoading()
		// 场景1：数据简化（剥离 data）
		// 处理返回数据
		return response.data
	},
	error => {
		// 2. 请求失败走这里
		// 对响应错误做些什么
		// 请求成功或失败都关闭loading
		//  场景2：处理请求失败和 token 失效 401

		if (error.statusCode === 401) {
			// 页面栈
			const pageStack = getCurrentPages()
			console.log('页面堆栈：', pageStack, pageStack[pageStack.length - 1])
			// 当前页面地址=》使用全路径，因为他会携带页面上的参数
			const fullPath = pageStack[pageStack.length - 1].$page.fullPath
			const path = pageStack[pageStack.length - 1].route
			// tabBar 页面需要使用 switchTab 跳转
			const routeType = tabBarPagePaths.includes(path) ?
				'switchTab' :
				'redirectTo'
			// encodeURIComponent() 函数只对特殊字符进行编码，而不会对字母、数字和其他常见字符进行编码。
			// 确保 URL 的可读性和兼容性，保障参数的正确传递=》代码更严谨
			// 1. routeType 跳转方式  2. redirectURL 回跳地址
			uni.redirectTo({
				url: `/pages/login/index?routeType=${routeType}&redirectURL=${encodeURIComponent(fullPath)}`,
			})
		}

		uni.hideLoading()
		return Promise.reject(error)
	}
)

// 导出 create 创建后的实例
export default instance